package server;

class Monitor {

    private int N;
    private int cadeiras;
    private int[] garfos;
    private int proxPorta = 10000;
    private int byes;

    private void InicializacaoSemaforos(){
        
        cadeiras = N;
        garfos = new int[N];
        for (int i = 0; i < N; i++){
            garfos[i] = 1;
        }
        byes = 0;

    }

    public synchronized String Sit() {
        if (cadeiras > 0) {
            proxPorta =  proxPorta + 1;
            cadeiras = cadeiras - 1;
            String cadeira = Integer.toString(cadeiras+1);
            return cadeira + "/" + N + "/" + proxPorta ;
        } else {
            return "NOK";
        }

    }

    public synchronized String P(int sem) throws InterruptedException{

        while (garfos[sem-1] == 0){
            wait(10);
        }

        garfos[sem-1] = garfos[sem-1] - 1;

//        for (int x:garfos) {
//            System.out.print(x+" ");
//        }
//        System.out.println();

        return "OK";

    }

    public synchronized void V(int sem){

        garfos[sem-1] = garfos[sem-1] + 1;

//        for (int x:garfos) {
//            System.out.print(x+" ");
//        }
//        System.out.println();

    }

    public Monitor(int totalFilosofos){
        N = totalFilosofos;
        InicializacaoSemaforos();
    }

    public synchronized int getN() {
        return N;
    }

    public synchronized int getCadeiras() {
        return cadeiras;
    }

    public synchronized int[] getGarfos() {
        return garfos;
    }

    public synchronized int getByes() {
        return byes;
    }

    public synchronized void setByes(int byes) {
        this.byes = byes;
    }

    public synchronized void setN(int N) {
        this.N = N;
    }

    public synchronized void setCadeiras(int cadeiras) {
        this.cadeiras = cadeiras;
    }

    public synchronized void setGarfos(int[] garfos) {
        this.garfos = garfos;
    }
}

    
